package com.spider.site.web.processor;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.spider.site.entity.SpiderResult;
import com.spider.site.pojo.util.SpiderUtil;
import com.spider.site.service.SpiderService;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html;

/**
 * 爱奇艺 定制， 该平台也是使用 ws 做弹幕系统
 * 播放器使用flash,这个也是相对简单抓包的平台
 * 果然还是斗鱼变态一些
 * @author wq
 *
 */
@Component
public class SpiderAQYProcessor implements PageProcessor{

	@Autowired
	private SpiderService spiderService;

	@Autowired
	private SpiderUtil spiderUtil;
	
	private Site site = Site.me().setRetryTimes(3).setSleepTime(200);// 基础配置
	
	
	@Override
	public void process(Page page) {
		String url = page.getRequest().getUrl();
		SpiderResult spiderResult = this.spiderService.getByURL(url);
		WebDriver webDriver = new InternetExplorerDriver();
		/* 1.访问爬取的网站 */
		webDriver.get(url);
		while (spiderResult.getIsSpin() == 1) {// 是否需要爬取
			try {
				/* 2.线程睡眠 ，以让页面渲染完整 */
				Thread.sleep(30 * 1000);// 睡眠 30s
				/* 3.解析页面元素 （核心） */
				WebElement webElement = webDriver.findElement(By.xpath("/html"));
				Html html = new Html(webElement.getAttribute("outerHTML"));// 获取到 html对象
				String name = spiderResult.getName(), //直播间名称
					   author = spiderResult.getAuthor(),//主播
					   image = spiderResult.getImage();//头像
				if(!spiderUtil.isNullOrEmpty(name , author , image)){//极小变化的抓取值，不需要每次都要解析
					name = html.xpath("/html/body/div[1]/div[4]/div[1]/div[1]/div[1]/div[2]/div[1]/h2/text()").get();// 直播间名称
					author = html.xpath("/html/body/div[1]/div[4]/div[1]/div[1]/div[1]/div[2]/div[2]/ul/li[1]/a/text()").get();// 主播名
					image = html.xpath("/html/body/div[1]/div[4]/div[1]/div[1]/div[1]/div[1]/a/img/@src").get();// 头像
				}
				String number = html.xpath("/html/body/div[1]/div[4]/div[1]/div[1]/div[1]/div[2]/div[2]/ul/li[3]/span/text()").get();// 热度
//				String time = html.xpath("//*[@class=\"time-v-con\"]/a/text()").get();//上次直播的时间，假如获取到这个值证明该主播已经下播
				List<String> userNames = html
						.xpath("//*[@id=\"msg-list\"]/li/span[@class='nickname']/text()").all().stream()
						.filter(n -> !n.equals("")).collect(Collectors.toList());// 用户名
				List<String> comments = html
						.xpath("//*[@id=\"msg-list\"]/li/span[3]/text()").all()
						.stream().filter(c -> !spiderUtil.filterWord(c) && !c.equals("")).collect(Collectors.toList());// 评论
				spiderUtil.savaSpiderData(this.formatNumber(number), name, this.mergeList(userNames, comments), author, spiderResult, image , url , null);// 保存数据（持久化）
				/* 4.正常爬取数据成功后的处理 */
				spiderResult = spiderService.getByURL(url);// 更新一下对象的状态
				spiderUtil.updateSpinStatus(spiderResult, 1);
			} catch (Exception e) {
				e.printStackTrace();
				spiderUtil.exceptionCommon(e, url);//异常处理
				break;//跳出循环
			}
		}
		spiderUtil.updateSpinStatus(spiderResult, 0);
		webDriver.quit();// 离开（该方法比 close()彻底）
	}
	
	/**
	 * 格式化 数字
	 * @param number
	 * @return
	 */
	public String formatNumber(String number) {
		return number.trim();
	}
	
	
	/**
	 * 评论 合成
	 * 
	 * @param list
	 * @return
	 */
	public  List<String> mergeList(List<String> name, List<String> comment) {
		List<String> list = new ArrayList<>();
		if(name != null && comment != null && name.size() > 0 && comment.size() > 0) {
			for (int i = 0; i < name.size(); i++) {
				if(comment.get(i).equals("赠送主播")) {
					list.add(name.get(i) + comment.get(i)+"礼物");
				}else {
					list.add(name.get(i) + comment.get(i));
				}
			}
		}
		return list;
	}
	
	@Override
	public Site getSite() {
		return site;
	}

	
}
